﻿// Inner Fire 游戏引擎库
// PhysicsMath - 物理数学
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层（4）
// 与物理相关的数学
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-06-17

#pragma once

#include <graphics/graphics_def.h>
#include <graphics/transform_def.h>

namespace ifire::game {
class RigidBody;

class physics_math {
public:
  // 创建一个引力力量
  static IVec3 GenerateGravitationForce(
      const RigidBody& a, const RigidBody& b, float G, float min, float max);
  // 创建一个弹簧力
  static IVec3 CreateSpringForce(
      const RigidBody& p, IVec3 anchor, float rest_length, float k);
  // 根据两个刚体创建弹簧力
  static IVec3 CreateSpringForce(
      const RigidBody& a, const RigidBody& b, float rest_length, float k);
  // 根据两个点，创建一个弹簧对象应该有的缩放。Width表示除去Y轴（因为这个主管长度）的缩放
  static Trans3 CalcSpringTransform(IVec3 start, IVec3 end, float width = 1.0f);
  // 线段到AABB最近点计算
  static IVec ClosestPointOnSegmentToAABB(
      IVec segStart, IVec segEnd, IVec aabbMin, IVec aabbMax);
  // 两线段最近点计算
  static void ClosestPointBetweenSegments(
      IVec a1, IVec a2, IVec b1, IVec b2, IVec& closestA, IVec& closestB);
};

} // namespace ifire::game